class Action{
  constructor(data){ 
    this.data = data;
    this.newpostions = [];
    //判断游戏是否结束标志位
    this.status = false;
  }
  insertNumber(){
    //动态插入一个数字2
    this.status = false;
    let postions = [];
    //1.先找到可以插入数字的位置：二维数组的索引
    this.data.forEach((row,rowIndex) =>{
      row.forEach((column,columnIndex) =>{
        if(column === 0){
          //该位置可以添加数字
          let postion ={};
          postion.i = rowIndex;
          postion.j = columnIndex;
          postions.push(postion);
        }
      })
    })
    //判断结束条件
    if(postions.length !=0){
      //2.随机向找到的位置添加一个数字
      //计算随机索引：范围（0-12）
      let index = Math.floor(Math.random() * postions.length);
      let dot = postions[index];
      //向指定二维数组索引位置添加数字2
      this.data[dot.i][dot.j] = 2;
    }
    this.adjacent();
    this.newpostions = postions;
  }

  leftAction(){
    //向左合并
    //控制向左滑动时的合并操作
    this.data.forEach(row =>{
      //合并操作
      //控制每一行的方块进行两两对比
      for(let left = 0;left <3;left ++){
        for(let right = 1;right <4-left;right ++){
          //两两方块进行对比
          if(row[left] !=0 && row[left + right] != 0){
            //符合合并条件：两者都不是0，并且两个数字相等
            if(row[left] == row[left + right]){
              //两个数字进行合并:左边数字翻倍，右边数据变成0
              row[left] = row[left] *2;
              row[left + right] = 0;
            }
            //符合规则之后，本次循环结束
            break;
          }
        }
      }  
      //移动操作
      for (let left = 0; left < 3; left++) {
        if(row[left] ===0){
          //如果左侧是零，右侧才可以向左移动        
          for(let right = 1;right <4-left;right++){
            //右侧数据不为零
            if(row[left + right] != 0){
              //向左移动的结果：将右侧数据赋值给左侧数据；右侧数据设置为零
              row[left] = row[left+right];
              row[left +right] = 0;
              break;
            }
          }
        }
      }
    });
  }
  rightAction(){
    //向右合并
    //控制向左滑动时的合并操作
    this.data.forEach(row => {
      //合并操作
      //控制每一行的方块进行两两对比
      for (let right = 3; right > 0; right --) {
        for (let left = 1; left <= right; left++) {
          //两两方块进行对比
          if (row[right] !== 0 && row[right -left] !== 0) {
            //符合合并条件：两者都不是0，并且两个数字相等
            if (row[right] === row[right - left]) {
              //两个数字进行合并:左边数字翻倍，右边数据变成0
              row[right] = row[right] * 2;
              row[right - left] = 0;
            }
            //符合规则之后，本次循环结束
            break;
          }
        }
      }
      //移动操作
      for (let right = 3; right > 0; right--) {
        if (row[right] === 0) {
          //如果右侧是零，左侧才可以向右移动        
          for (let left = 1; left <= right; left++) {
            //左侧数据不为零
            if (row[right - left] !== 0) {
              //向右移动的结果：将左侧数据赋值给右侧数据；左侧数据设置为零
              row[right] = row[right - left];
              row[right - left] = 0;
              break;
            }
          }
        }
      }
    });
  }
  upAction(){
    //向上合并
      let data = this.data;
      for(let column =0;column <4;column ++){
        //向上合并
        for(let top =0;top<3;top ++ ){
          for(let bottom =1;bottom<4-top;bottom ++){
            //上下两个值进行对比
            if(data[top][column] !=0 && data[top +bottom][column] !=0){
              //两个不为0的值进行对比，如果相等进行合并
              if (data[top][column] == data[top + bottom][column]){
                //进行合并:上面的值翻倍，下面的值设置为0
                data[top][column] = data[top][column] *2;
                data[top + bottom][column] = 0;
              }
              break;
            }
          }
        }
        //向上移动
        for (let top = 0; top < 3; top++) {
          if(data[top][column] ===0){
            //上面的值必须等于0可以向上移动
            for (let bottom = 1; bottom < 4 - top; bottom++) {
              if(data[top + bottom][column] !=0){
                //向上移动：下面的值赋值给上面的值，下面的值设置为0
                data[top][column] = data[top + bottom][column];
                data[top + bottom][column] = 0;
                break;
              }
            }
          }
        }
      }
  }
  downAction(){
    let data = this.data;
    for (let column = 0; column < 4; column++) {
      //向下合并
      for (let bottom = 3; bottom > 0; bottom--) {
        for (let top = 1; top <= bottom; top++) {
          //上下两个值进行对比
          if (data[bottom][column] != 0 && data[bottom - top][column] != 0) {
            //两个不为0的值进行对比，如果相等进行合并
            if (data[bottom][column] == data[bottom - top][column]) {
              //进行合并:上面的值翻倍，下面的值设置为0
              data[bottom][column] = data[bottom][column] * 2;
              data[bottom - top][column] = 0;
            }
            break;
          }
        }
      }
      //向下移动
      for (let bottom = 3; bottom > 0; bottom--){
        if (data[bottom][column] === 0) {
          //上面的值必须等于0可以向上移动
          for (let top = 1; top <= bottom; top++) {
            if (data[bottom - top][column] != 0) {
              //向上移动：下面的值赋值给上面的值，下面的值设置为0
              data[bottom][column] = data[bottom -top][column];
              data[bottom - top][column] = 0;
              break;
            }
          }
        }
      }
    }
  }
  adjacent(){
    let data = this.data;
    data.forEach((row) =>{
      for (let i = 0; i < 3; i++) {
        if (row[i] === row[i + 1]) {
          this.status = true;
        }
      }
    })
    for (let column = 0; column < 4; column++){
      for(let row = 0;row <3;row++){
        if (data[row][column] === data[row + 1][column]) {
          this.status = true;
        }
      }
    }
  }
}

export default Action;